#pragma once
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include "node.h"
using namespace std;
/*
 * 用于把leetcode的用例字符串转换成对应数据结构
 */

// vec
vector<int> getIntVec(const string& str) {
    if (str.empty())
        return {};
    vector<int> ret;
    int start = str[0] == '[' ? 1 : 0;
    stringstream ss(str.substr(start));  // 去掉第一个方括号
    string value;
    while (getline(ss, value, ',')) {  // 以逗号为分隔符提取每个元素
        try {
            /* code */
            int element = stoi(value);  // 末尾的"]"多余符号会忽略
            ret.push_back(element);
        } catch (const std::exception& e) {
            // 输入中的NULL看成-1
            ret.push_back(-1);
        }
    }
    return ret;
}
// vec2
vector<vector<int>> getIntVec2(const string& str) {
    if (str.empty())
        return {};
    vector<vector<int>> matrix;
    stringstream ss(str.substr(1, str.length() - 2));  // 去除字符串中的方括号
    string row;
    while (getline(ss, row, '[')) {  // 以左方括号作为行的开始标志
        if (!row.empty()) {
            matrix.push_back(getIntVec(row));
        }
    }
    return matrix;
}
// list
ListNode* getIntList(const string& str) {
    ListNode* vhead = new ListNode(-1);
    ListNode* cur = vhead;
    stringstream ss(str.substr(1));  // 去掉第一个方括号
    string value;
    while (getline(ss, value, ',')) {  // 以逗号为分隔符提取每个元素
        int element = stoi(value);     // 末尾的"]"多余符号会忽略
        cur->next = new ListNode(element);
        cur = cur->next;
    }
    cur = vhead->next;
    delete vhead;
    vhead = nullptr;
    return cur;
}

// tree
/*
 *输入数组是层序遍历的，例如[1,2,3,4,5,null,6,7,null,9]
 *注意默认tree中数据为非负数
 */
TreeNode* getTreeFromVec(vector<int>& vec) {
    if (vec.empty())
        return nullptr;

    auto root = new TreeNode(vec[0]);
    queue<TreeNode*> q;
    q.emplace(root);
    int cnt = 2;  // 第几层
    int index = 1;
    int vecSize = vec.size();
    while (!q.empty()) {
        if (index == vecSize)
            break;
        for (int i = 0; i < cnt && index < vecSize; ++i) {
            if (q.empty())
                break;
            auto node = q.front();
            q.pop();
            // 默认-1为NULL
            if (vec[index] != -1) {
                node->left = new TreeNode(vec[index]);
                q.emplace(node->left);
            }
            ++index;
            if (index == vecSize)
                break;
            if (vec[index] != -1) {
                node->right = new TreeNode(vec[index]);
                q.emplace(node->right);
            }
            ++index;
        }
        cnt << 1;
    }
    return root;
}
